﻿/*
 * My97 DatePicker 4.8.5
 * License: http://www.my97.net/license.asp
 */
var $dp, WdatePicker
;(function () {
  var Config = {
    $langList: [
      {
        name: 'en',
        charset: 'UTF-8'
      },
      {
        name: 'zh-cn',
        charset: 'gb2312'
      },
      {
        name: 'zh-tw',
        charset: 'GBK'
      }
    ],
    $skinList: [
      {
        name: 'default',
        charset: 'gb2312'
      },
      {
        name: 'whyGreen',
        charset: 'gb2312'
      },
      {
        name: 'blue',
        charset: 'gb2312'
      },
      {
        name: 'green',
        charset: 'gb2312'
      },
      {
        name: 'simple',
        charset: 'gb2312'
      },
      {
        name: 'ext',
        charset: 'gb2312'
      },
      {
        name: 'blueFresh',
        charset: 'gb2312'
      },
      {
        name: 'twoer',
        charset: 'gb2312'
      },
      {
        name: 'YcloudRed',
        charset: 'gb2312'
      },
      {
        name: 'thinkpap',
        charset: 'gb2312'
      }
    ],
    $wdate: false,
    $crossFrame: false,
    $preLoad: false,
    $dpPath: '',
    doubleCalendar: false,
    enableKeyboard: true,
    enableInputMask: true,
    autoUpdateOnChanged: null,
    weekMethod: 'MSExcel',
    position: {},
    lang: 'auto',
    skin: 'default',
    dateFmt: 'yyyy年MM月dd日 HH时mm分',
    realDateFmt: 'yyyy-MM-dd',
    realTimeFmt: 'HH:mm:ss',
    realFullFmt: '%Date %Time',
    minDate: '0001-01-01 00:00:00',
    maxDate: '9999-12-31 23:59:59',
    minTime: '00:00:00',
    maxTime: '23:59:59',
    startDate: '',
    alwaysUseStartDate: false,
    yearOffset: 1911,
    firstDayOfWeek: 0,
    isShowWeek: false,
    highLineWeekDay: true,
    isShowClear: true,
    isShowToday: true,
    isShowOK: true,
    isShowOthers: true,
    readOnly: false,
    errDealMode: 0,
    autoPickDate: null,
    qsEnabled: true,
    autoShowQS: false,
    hmsMenuCfg: {
      H: [1, 6],
      m: [5, 6],
      s: [15, 4]
    },

    opposite: false,
    specialDates: null,
    specialDays: null,
    disabledDates: null,
    disabledDays: null,
    onpicking: null,
    onpicked: null,
    onclearing: null,
    oncleared: null,
    ychanging: null,
    ychanged: null,
    Mchanging: null,
    Mchanged: null,
    dchanging: null,
    dchanged: null,
    Hchanging: null,
    Hchanged: null,
    mchanging: null,
    mchanged: null,
    schanging: null,
    schanged: null,
    eCont: null,
    vel: null,
    elProp: '',
    errMsg: '',
    quickSel: [],
    has: {},
    getRealLang: function () {
      var arr = Config.$langList
      for (var i = 0; i < arr.length; i++) {
        if (arr[i].name == this.lang) {
          return arr[i]
        }
      }
      return arr[0]
    }
  }
  WdatePicker = main
  var w = window,
    emptyEl = {
      innerHTML: ''
    },
    d = 'document',
    de = 'documentElement',
    tag = 'getElementsByTagName',
    dptop,
    jsPath,
    $IE,
    $FF,
    $OPERA
  var ua = navigator.userAgent,
    isTablet = /(?:iPad|PlayBook)/.test(ua) || (/(?:Android)/.test(ua) && !/(?:Mobile)/.test(ua)),
    isPhone = /(?:iPhone)/.test(ua) || (/(?:Android)/.test(ua) && /(?:Mobile)/.test(ua))
  var appName = navigator.appName
  if (appName == 'Microsoft Internet Explorer') $IE = true
  else if (appName == 'Opera') $OPERA = true
  else $FF = true
  jsPath = Config.$dpPath || getJsPath()
  if (Config.$wdate) {
    loadCSS(jsPath + 'skin/WdatePicker.css')
  }
  dptop = w
  if (Config.$crossFrame) {
    try {
      while (dptop.parent != dptop && dptop.parent[d][tag]('frameset').length == 0) {
        dptop = dptop.parent
      }
    } catch (e) {}
  }
  if (!dptop.$dp) {
    dptop.$dp = {
      ff: $FF,
      ie: $IE,
      opera: $OPERA,
      status: 0,
      defMinDate: Config.minDate,
      defMaxDate: Config.maxDate,
      isTablet: isTablet,
      isPhone: isPhone,
      isTouch: isTablet || isPhone
    }
  }
  initTopDP()
  if (Config.$preLoad && $dp.status == 0) {
    dpAttachEvent(w, 'onload', function () {
      main(null, true)
    })
  }
  var docEventName = $dp.isTouch ? 'ontouchstart' : 'onmousedown'
  if (!w[d].docMD) {
    dpAttachEvent(w[d], docEventName, disposeDP, true)
    w[d].docMD = true
  }
  if (!dptop[d].docMD) {
    dpAttachEvent(dptop[d], docEventName, disposeDP, true)
    dptop[d].docMD = true
  }
  dpAttachEvent(w, 'onunload', function () {
    if ($dp.dd) {
      display($dp.dd, 'none')
    }
  })

  function initTopDP() {
    try {
      ;(dptop[d], (dptop.$dp = dptop.$dp || {}))
    } catch (e) {
      dptop = w
      $dp = $dp || {}
    }
    var obj = {
      win: w,
      $: function (el) {
        return typeof el == 'string' ? w[d].getElementById(el) : el
      },
      $D: function (id, arg) {
        return this.$DV(this.$(id).value, arg)
      },
      $DV: function (v, arg) {
        if (v != '') {
          this.dt = $dp.cal.splitDate(v, $dp.cal.dateFmt)
          if (arg) {
            for (var p in arg) {
              if (this.dt[p] === undefined) {
                this.errMsg = 'invalid property:' + p
              } else {
                this.dt[p] += arg[p]
                if (p == 'M') {
                  var offset = arg['M'] > 0 ? 1 : 0
                  var tmpday = new Date(this.dt['y'], this.dt['M'], 0).getDate()
                  this.dt['d'] = Math.min(tmpday + offset, this.dt['d'])
                }
              }
            }
          }
          if (this.dt.refresh()) {
            return this.dt
          }
        }
        return ''
      },
      show: function () {
        var divs = dptop[d].getElementsByTagName('div'),
          maxZIndex = 1e5
        for (var i = 0; i < divs.length; i++) {
          var curZ = parseInt(divs[i].style.zIndex)
          if (curZ > maxZIndex) {
            maxZIndex = curZ
          }
        }
        this.dd.style.zIndex = maxZIndex + 2
        display(this.dd, 'block')
        display(this.dd.firstChild, '')
      },
      unbind: function (el) {
        el = this.$(el)
        if (el.initcfg) {
          dpDetachEvent(el, 'onclick', function () {
            main(el.initcfg)
          })
          dpDetachEvent(el, 'onfocus', function () {
            main(el.initcfg)
          })
        }
      },
      hide: function () {
        display(this.dd, 'none')
      },
      attachEvent: dpAttachEvent
    }
    for (var p in obj) {
      dptop.$dp[p] = obj[p]
    }
    $dp = dptop.$dp
  }

  function dpAttachEvent(o, sType, fHandler, useCapture) {
    if (o.addEventListener) {
      var shortTypeName = sType.replace(/on/, '')
      fHandler._ieEmuEventHandler = function (e) {
        return fHandler(e)
      }
      o.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, useCapture)
    } else {
      o.attachEvent(sType, fHandler)
    }
  }

  function dpDetachEvent(o, sType, fHandler) {
    if (o.removeEventListener) {
      var shortTypeName = sType.replace(/on/, '')
      fHandler._ieEmuEventHandler = function (e) {
        return fHandler(e)
      }
      o.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false)
    } else {
      o.detachEvent(sType, fHandler)
    }
  }

  function compareCfg(o1, o2, issub) {
    if (typeof o1 != typeof o2) return false
    if (typeof o1 == 'object') {
      if (!issub) {
        for (var o in o1) {
          if (typeof o2[o] == 'undefined') return false
          if (!compareCfg(o1[o], o2[o], true)) return false
        }
      }
      return true
    } else if (typeof o1 == 'function' && typeof o2 == 'function') {
      return o1.toString() == o2.toString()
    } else {
      return o1 == o2
    }
  }

  function getJsPath() {
    var path,
      tmp,
      scripts = w[d][tag]('script')
    for (var i = 0; i < scripts.length; i++) {
      path = scripts[i].getAttribute('src') || ''
      path = path.substr(0, path.toLowerCase().indexOf('wdatepicker.js'))
      var tmp = path.lastIndexOf('/')
      if (tmp > 0) path = path.substring(0, tmp + 1)
      if (path) break
    }
    return path
  }

  function loadCSS(path, title, charset) {
    var head = w[d][tag]('HEAD').item(0),
      style = w[d].createElement('link')
    if (head) {
      style.href = path
      style.rel = 'stylesheet'
      style.type = 'text/css'
      if (title) style.title = title
      if (charset) style.charset = charset
      head.appendChild(style)
    }
  }

  function getAbsM(w) {
    w = w || dptop
    var lm = 0,
      tm = 0
    while (w != dptop) {
      var ifs = w.parent[d][tag]('iframe')
      for (var i = 0; i < ifs.length; i++) {
        try {
          if (ifs[i].contentWindow == w) {
            var rc = getBound(ifs[i])
            lm += rc.left
            tm += rc.top
            break
          }
        } catch (e) {}
      }
      w = w.parent
    }
    return {
      'leftM': lm,
      'topM': tm
    }
  }

  function getBound(o, ignoreScr) {
    if (o.getBoundingClientRect) {
      return o.getBoundingClientRect()
    } else {
      var patterns = {
        ROOT_TAG: /^body|html$/i,
        OP_SCROLL: /^(?:inline|table-row)$/i
      }
      var hssFixed = false,
        win = null,
        t = o.offsetTop,
        l = o.offsetLeft,
        r = o.offsetWidth,
        b = o.offsetHeight
      var parentNode = o.offsetParent
      if (parentNode != o) {
        while (parentNode) {
          l += parentNode.offsetLeft
          t += parentNode.offsetTop
          if (getStyle(parentNode, 'position').toLowerCase() == 'fixed') hssFixed = true
          else if (parentNode.tagName.toLowerCase() == 'body') win = parentNode.ownerDocument.defaultView
          parentNode = parentNode.offsetParent
        }
      }
      parentNode = o.parentNode
      while (parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName)) {
        if (parentNode.scrollTop || parentNode.scrollLeft) {
          if (!patterns.OP_SCROLL.test(display(parentNode))) {
            if (!$OPERA || parentNode.style.overflow !== 'visible') {
              l -= parentNode.scrollLeft
              t -= parentNode.scrollTop
            }
          }
        }
        parentNode = parentNode.parentNode
      }
      if (!hssFixed) {
        var scr = getScroll(win)
        l -= scr.left
        t -= scr.top
      }
      r += l
      b += t
      return {
        'left': l,
        'top': t,
        'right': r,
        'bottom': b
      }
    }
  }

  function getWH(w) {
    w = w || dptop
    var doc = w[d],
      width = w.innerWidth ? w.innerWidth : doc[de] && doc[de].clientWidth ? doc[de].clientWidth : doc.body.offsetWidth,
      height = w.innerHeight
        ? w.innerHeight
        : doc[de] && doc[de].clientHeight
          ? doc[de].clientHeight
          : doc.body.offsetHeight
    return {
      'width': width,
      'height': height
    }
  }

  function getScroll(w) {
    w = w || dptop
    var doc = w[d],
      doce = doc[de],
      db = doc.body
    doc =
      doce && doce.scrollTop != null && (doce.scrollTop > db.scrollTop || doce.scrollLeft > db.scrollLeft) ? doce : db
    return {
      'top': doc.scrollTop,
      'left': doc.scrollLeft
    }
  }

  function disposeDP(e) {
    try {
      var src = e ? e.srcElement || e.target : null
      if ($dp.cal && !$dp.eCont && $dp.dd && src != $dp.el && $dp.dd.style.display == 'block') {
        $dp.cal.close()
      }
    } catch (e) {}
  }

  function dpLoaded() {
    $dp.status = 2
  }
  var isDptopReady, dptopInterval

  function main(initcfg, preLoad) {
    if (!$dp) return
    initcfg.el = initcfg.el || w[d].activeElement
    if ($dp.isTouch) {
      try {
        initcfg.el.readOnly = true
        initcfg.el.blur()
      } catch (e) {}
    }
    initTopDP()
    var cfg = {}
    for (var p in initcfg) {
      cfg[p] = initcfg[p]
    }
    for (var p in Config) {
      if (p.substring(0, 1) != '$' && cfg[p] === undefined) {
        cfg[p] = Config[p]
      }
    }
    if (preLoad) {
      if (!dptopReady()) {
        dptopInterval =
          dptopInterval ||
          setInterval(function () {
            if (dptop[d].readyState == 'complete') {
              clearInterval(dptopInterval)
            }
            main(null, true)
          }, 50)
        return
      }
      if ($dp.status == 0) {
        $dp.status = 1
        cfg.el = emptyEl
        showPicker(cfg, true)
      } else {
        return
      }
    } else if (cfg.eCont) {
      cfg.eCont = $dp.$(cfg.eCont)
      cfg.el = emptyEl
      cfg.autoPickDate = true
      cfg.qsEnabled = false
      showPicker(cfg)
    } else {
      if (Config.$preLoad && $dp.status != 2) return
      if (!cfg.el) {
        var evt = SearchEvent()
        if (w.event === evt || evt) {
          cfg.srcEl = evt.srcElement || evt.target
          evt.cancelBubble = true
        }
      }
      cfg.el = cfg.el = $dp.$(cfg.el || cfg.srcEl)
      if (cfg.el == null) {
        alert('WdatePicker:el is null!\nexample:onclick="WdatePicker({el:this})"')
        return
      }
      try {
        if (
          !cfg.el ||
          cfg.el['My97Mark'] === true ||
          cfg.el.disabled ||
          ($dp.dd && display($dp.dd) != 'none' && $dp.dd.style.left != '-970px')
        ) {
          if (cfg.el['My97Mark']) cfg.el['My97Mark'] = false
          return
        }
      } catch (e) {}
      if (evt && cfg.el.nodeType == 1 && !compareCfg(cfg.el.initcfg, initcfg)) {
        $dp.unbind(cfg.el)
        dpAttachEvent(cfg.el, evt.type == 'focus' ? 'onclick' : 'onfocus', function () {
          main(initcfg)
        })
        cfg.el.initcfg = initcfg
      }
      showPicker(cfg)
    }

    function dptopReady() {
      if ($IE && dptop != w && dptop[d].readyState != 'complete') return false
      return true
    }

    function SearchEvent() {
      if ($FF) {
        try {
          var count = 0
          func = SearchEvent.caller
          while (func != null) {
            var arg0 = func.arguments[0]
            if ((arg0 && (arg0 + '').indexOf('Event') >= 0) || count++ > 97) {
              return arg0
            }
            func = func.caller
          }
        } catch (e) {}
        return null
      }
      return event
    }
  }

  function getStyle(obj, attribute) {
    return obj.currentStyle ? obj.currentStyle[attribute] : document.defaultView.getComputedStyle(obj, false)[attribute]
  }

  function display(obj, value) {
    if (obj) {
      if (value != null) obj.style.display = value
      else return getStyle(obj, 'display')
    }
  }

  function showPicker(cfg, preLoad) {
    var nodeName = cfg.el ? cfg.el.nodeName : 'INPUT'
    if (preLoad || cfg.eCont || new RegExp(/input|textarea|div|field|span|p|a/gi).test(nodeName)) {
      cfg.elProp = cfg.elProp || nodeName == 'INPUT' ? 'value' : 'innerHTML'
    } else {
      return
    }
    if (cfg.lang == 'auto') {
      cfg.lang = $IE ? navigator.browserLanguage.toLowerCase() : navigator.language.toLowerCase()
    }
    if (!cfg.eCont) {
      for (var p in cfg) {
        $dp[p] = cfg[p]
      }
    }
    if (!$dp.dd || cfg.eCont || ($dp.dd && (cfg.getRealLang().name != $dp.dd.lang || cfg.skin != $dp.dd.skin))) {
      if (cfg.eCont) {
        ddInit(cfg.eCont, cfg)
      } else {
        $dp.dd = dptop[d].createElement('DIV')
        $dp.dd.style.cssText = 'position:absolute'
        dptop[d].body.appendChild($dp.dd)
        ddInit($dp.dd, cfg)
        if (preLoad) {
          $dp.dd.style.left = $dp.dd.style.top = '-970px'
        } else {
          $dp.show()
          setPos($dp)
        }
      }
    } else if ($dp.cal) {
      $dp.show()
      $dp.cal.init()
      if (!$dp.eCont) setPos($dp)
    }

    function ddInit(cont, cfg) {
      var dm = dptop[d].domain,
        isCross = false,
        defHtml =
          '<iframe hideFocus=true width=9 height=7 frameborder=0 border=0 scrolling=no src="about:blank"></iframe>'
      cont.innerHTML = defHtml
      var langList = Config.$langList,
        skinList = Config.$skinList,
        doc
      try {
        doc = cont.lastChild.contentWindow[d]
      } catch (e) {
        isCross = true
        cont.removeChild(cont.lastChild)
        var ifr = dptop[d].createElement('iframe')
        ifr.hideFocus = true
        ifr.frameBorder = 0
        ifr.scrolling = 'no'
        ifr.src = "javascript:(function(){var d=document;d.open();d.domain='" + dm + "';})()"
        cont.appendChild(ifr)
        setTimeout(function () {
          doc = cont.lastChild.contentWindow[d]
          ddWrite()
        }, 97)
        return
      }
      ddWrite()

      function ddWrite() {
        var realLang = cfg.getRealLang(),
          ver = '4.9.0b3'
        cont.lang = realLang.name
        cont.skin = cfg.skin
        var h = [
          '<head><script>',
          '',
          'var doc=document, $d, $dp, $cfg=doc.cfg, $pdp = parent.$dp, $dt, $tdt, $sdt, $lastInput, $IE=$pdp.ie, $FF = $pdp.ff,$OPERA=$pdp.opera, $ny, $cMark = false;',
          'if($cfg.eCont){$dp = {};for(var p in $pdp)$dp[p]=$pdp[p];}else{$dp=$pdp;};for(var p in $cfg){$dp[p]=$cfg[p];}',
          'if(!$dp.isTouch)doc.oncontextmenu=function(){try{$c._fillQS(!$dp.has.d,1);showB($d.qsDivSel);}catch(e){};return false;};',
          '</script><script src=',
          jsPath,
          'lang/',
          realLang.name,
          '.js?' + ver + ' charset=',
          realLang.charset,
          '></script>'
        ]
        if (isCross) h[1] = 'document.domain="' + dm + '";'
        for (var i = 0; i < skinList.length; i++) {
          if (skinList[i].name == cfg.skin) {
            h.push(
              '<link rel="stylesheet" type="text/css" href="' + jsPath + 'skin/' + skinList[i].name + '/datepicker.css?'
            )
            h.push(ver)
            h.push('" charset="' + skinList[i].charset + '"/>')
          }
        }
        h.push('<script src="' + jsPath + 'calendar.js?')
        h.push(ver)
        h.push('"></script>')
        h.push('</head><body leftmargin="0" topmargin="0" tabindex=0></body></html>')
        h.push(
          '<script>var t;t=t||setInterval(function(){if((typeof(doc.ready)=="boolean"&&doc.ready)||doc.readyState=="complete"){new My97DP();$cfg.onload();$c.autoSize();$cfg.setPos($dp);clearInterval(t);}},20);</script>'
        )
        cfg.setPos = setPos
        cfg.onload = dpLoaded
        doc.write('<html>')
        doc.cfg = cfg
        doc.write(h.join(''))
        doc.close()
      }
    }

    function setPos(dp) {
      var l = dp.position.left,
        t = dp.position.top,
        el = dp.el
      if (el == emptyEl) return
      if (el != dp.srcEl && (display(el) == 'none' || el.type == 'hidden')) el = dp.srcEl
      var objxy = getBound(el),
        mm = getAbsM(w),
        currWH = getWH(dptop),
        scr = getScroll(dptop),
        ddHeight = $dp.dd.offsetHeight,
        ddWidth = $dp.dd.offsetWidth
      if (isNaN(t)) t = 0
      if (mm.topM + objxy.bottom + ddHeight > currWH.height && mm.topM + objxy.top - ddHeight > 0) {
        t += scr.top + mm.topM + objxy.top - ddHeight - 2
      } else {
        t += scr.top + mm.topM + objxy.bottom
        var offsetT = t - scr.top + ddHeight - currWH.height
        if (offsetT > 0) t -= offsetT
      }
      if (isNaN(l)) l = 0
      l += scr.left + Math.min(mm.leftM + objxy.left, currWH.width - ddWidth - 5) - ($IE ? 2 : 0)
      dp.dd.style.top = t + 2 + 'px'
      dp.dd.style.left = l + 'px'
    }
  }
})()
